package itheima05;
/*
    解决方案: 使用同步技术

    同步代码块
        1.作用: 解决线程安全问题的
        2.格式:
            synchronized(任意对象) {
                ....
            }
        3.注意:
            (1){}: 所有操作共享数据的代码,都要写在{}中
            (2)任意对象: 对象锁,锁对象,专业术语: 对象监视器
            (3)锁对象可以是任意对象,必须保证唯一
 */
/*
public class MyTickets implements Runnable{
    //因为100张票,被3个线程共享使用,所以定义在成员位置
    private int tickets = 100;
    //创建Object对象,作为锁对象,因为在成员位置,所以是唯一的
    private Object obj = new Object();

    @Override
    public void run() {
        //Object obj = new Object();//不能定义在这里
        //死循环
        while(true) {
            synchronized (obj) {
                //(1)判断是否有票
                if(tickets>0) {
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //(2)有: 出一张票
                    System.out.println("窗口: "+Thread.currentThread().getName()+" 卖出第: "+tickets+" 张票....");
                    //(3)减少一张票
                    tickets--;
                }
            }
        }
    }
}
*/

public class MyTickets implements Runnable{
    private  int tickets=100;
    //创建Object对象,作为锁对象,因为在成员位置,所以是唯一的
    private  Object obj=new Object();
    @Override
    public void  run(){
        while (true){
            synchronized (obj){
                if (tickets>0){
                    try {
                        Thread.sleep(50);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println("窗口:"+Thread.currentThread().getName()+"卖出了"+tickets+"张票");
                    tickets--;
                }
            }
        }

    }
}